<!-- HTML header for doxygen 1.8.3.1-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.3.1"/>
<title>AngelScript: Automatic wrapper functions</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<script type="test/javascript" src="touch.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
  $(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
  $(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectlogo"><img alt="Logo" src="aslogo_small.png"/></td>
  <td style="padding-left: 0.5em;">
   <div id="projectname">AngelScript
   </div>
  </td>
   <td>        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Search" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
</td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.3.1 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('doc_addon_autowrap.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&#160;</span>Macros</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(9)"><span class="SelectionMark">&#160;</span>Pages</a></div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">Automatic wrapper functions </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p><b>Path:</b> /sdk/add_on/autowrapper/aswrappedcall.h</p>
<p>This header file declares some macros and template functions that will let the application developer automatically generate wrapper functions using the <a class="el" href="doc_generic.html">generic calling convention</a> with a simple call to a preprocessor macro. This is useful for those platforms where the native calling conventions are not yet supported.</p>
<p>The macros are defined as:</p>
<div class="fragment"><div class="line"><span class="comment">// Wrap a global function with implicit or explicit signature</span></div>
<div class="line"><span class="preprocessor">#define WRAP_FN(name)</span></div>
<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define WRAP_FN_PR(name, Parameters, ReturnType)</span></div>
<div class="line"><span class="preprocessor"></span></div>
<div class="line"><span class="comment">// Wrap a class method with implicit or explicit signature</span></div>
<div class="line"><span class="preprocessor">#define WRAP_MFN(ClassType, name)</span></div>
<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define WRAP_MFN_PR(ClassType, name, Parameters, ReturnType)</span></div>
<div class="line"><span class="preprocessor"></span></div>
<div class="line"><span class="comment">// Wrap a global function that will emulate a class method and receives the &#39;this&#39; pointer as the first argument</span></div>
<div class="line"><span class="preprocessor">#define WRAP_OBJ_FIRST(name)</span></div>
<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define WRAP_OBJ_FIRST_PR(name, Parameters, ReturnType)</span></div>
<div class="line"><span class="preprocessor"></span></div>
<div class="line"><span class="comment">// Wrap a global function that will emulate a class method and receives the &#39;this&#39; pointer as the last argument</span></div>
<div class="line"><span class="preprocessor">#define WRAP_OBJ_LAST(name)</span></div>
<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define WRAP_OBJ_LAST_PR(name, Parameters, ReturnType)</span></div>
<div class="line"><span class="preprocessor"></span></div>
<div class="line"><span class="comment">// Wrap a constructor with an explicit signature</span></div>
<div class="line"><span class="preprocessor">#define WRAP_CON(ClassType, Parameters)</span></div>
<div class="line"><span class="preprocessor"></span></div>
<div class="line"><span class="comment">// Wrap a destructor</span></div>
<div class="line"><span class="preprocessor">#define WRAP_DES(ClassType)</span></div>
</div><!-- fragment --><p>As you can see they are very similar to the <a class="el" href="doc_register_func.html#doc_register_func_1">asFUNCTION</a> and <a class="el" href="doc_register_func.html#doc_register_func_1">asMETHOD</a> macros, and are used the same way.</p>
<p>Unfortunately the template functions needed to perform this generation are quite complex and older compilers may not be able to handle them. One such example is Microsoft Visual C++ 6, though luckily it has no need for them as AngelScript already supports native calling conventions for it.</p>
<h1><a class="anchor" id="doc_addon_autowrap_1"></a>
Example usage</h1>
<div class="fragment"><div class="line"><span class="preprocessor">#include &quot;aswrappedcall.h&quot;</span></div>
<div class="line"></div>
<div class="line"><span class="comment">// The application function that we want to register</span></div>
<div class="line"><span class="keywordtype">void</span> DoSomething(std::string param1, <span class="keywordtype">int</span> param2);</div>
<div class="line"></div>
<div class="line"><span class="comment">// Registering the wrapper with AngelScript</span></div>
<div class="line"><span class="keywordtype">void</span> RegisterWrapper(<a class="code" href="classas_i_script_engine.html" title="The engine interface.">asIScriptEngine</a> *engine)</div>
<div class="line">{</div>
<div class="line">  <span class="keywordtype">int</span> r;</div>
<div class="line"></div>
<div class="line">  <span class="comment">// The WRAP_FN macro automatically implements and returns the function pointer of the generic wrapper</span></div>
<div class="line">  <span class="comment">// function. Observe, that the calling convention should be set as asCALL_GENERIC in this case.</span></div>
<div class="line">  r = engine-&gt;<a class="code" href="classas_i_script_engine.html#a2f84b9b51733f22c68b8448b02c2f1c7" title="Registers a global function.">RegisterGlobalFunction</a>(<span class="stringliteral">&quot;void DoSomething(string, int)&quot;</span>, WRAP_FN(DoSomething), <a class="code" href="angelscript_8h.html#a3ec92ea3c4762e44c2df788ceccdd1e4a750c26b6a6e0c9ccbb93078f532ef8ce" title="A function using the generic calling convention.">asCALL_GENERIC</a>); assert( r &gt;= 0 );</div>
<div class="line">}</div>
</div><!-- fragment --><h1><a class="anchor" id="doc_addon_autowrap_2"></a>
Adding support for more parameters</h1>
<p>The aswrappedcall.h header file is by default prepared to support functions with up to 4 arguments. If you have a need for more arguments then you can use the generator that you find in the sub-directory to prepare a new header file.</p>
<p>Open the generateheader.cpp in an editor and set the max_args variable to the number of arguments you need and then compile and run the code. It will print the new header file to the standard output so you just need to direct this to a file. </p>
</div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="footer">Generated on Sun Dec 18 2016 12:35:27 for AngelScript by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.3.1 </li>
  </ul>
</div>
</body>
</html>
